static inline void do_timer_interrupt(int irq, void *dev_id,
struct pt_regs *regs)
{
- s64 delta;
- long sec_diff;
+ time_t wtm_sec, sec;
+ s64 delta. nsec;
+ long sec_diff, wtm_nsec;
+ long wtm_nsec;
__get_time_values_from_xen();
}
/* Update our unsynchronised xtime appropriately. */
- xtime.tv_sec = shadow_tv.tv_sec;
- xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC;
+ sec = shadow_tv.tv_sec;
+ nsec = shadow_tv.tv_usec * NSEC_PER_USEC;
+
+ __normalize_time(&sec, &nsec);
+ wtm_sec = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
+ wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
- last_update_from_xen = xtime.tv_sec;
+ set_normalized_timespec(&xtime, sec, nsec);
+ set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
+
+ last_update_from_xen = sec;
}
#ifdef CONFIG_XEN_PRIVILEGED_GUEST
return;
}
#endif
- xtime.tv_sec = HYPERVISOR_shared_info->wc_sec;
+ __get_time_values_from_xen();
+ xtime.tv_sec = shadow_tv.tv_sec;
wall_to_monotonic.tv_sec = -xtime.tv_sec;
- xtime.tv_nsec = HYPERVISOR_shared_info->wc_usec * NSEC_PER_USEC;
+ xtime.tv_nsec = shadow_tv.tv_usec * NSEC_PER_USEC;
wall_to_monotonic.tv_nsec = -xtime.tv_nsec;
+ processed_system_time = shadow_system_time;
cur_timer = select_timer();
printk(KERN_INFO "Using %s for high-res timesource\n",cur_timer->name);
- __get_time_values_from_xen();
- processed_system_time = shadow_system_time;
-
time_irq = bind_virq_to_irq(VIRQ_TIMER);
(void)setup_irq(time_irq, &irq_timer);